起動テンプレートを使って同じようなEC2 インスタンスを作ろう!
こんにちは。まるとです。
例えば、『同じ構成のEC2 インスタンスを3台作成する』という依頼があった場合、どのように対応しますか?
AWSマネジメントコンソール、AWS CLI、AWS CloudFormation、AWS CDK...色々な方法がありますね。
では別日に「以前構築したものと同じ構成のEC2 インスタンスをもう10台欲しい!」という依頼がきたらどうしましょう。
EC2には、後から同様のインスタンスを作成するためにテンプレート化できる『起動テンプレート』という機能があります。
今回はこちらを触っていきましょう!
起動テンプレートとは
簡潔にお伝えすると、後で再利用や共有ができる、EC2 インスタンスの起動設定をまとめたものです。
できることはEC2を起動するときに設定できるプロパティとほぼ同じです。
よく設定される、
- AMI
- キーペア
- ネットワーク設定
- ストレージ
- タグ
はもちろん、他にも
- 終了保護
- EBS 最適化インスタンス
- プレイスメントグループ
- インスタンスメタデータサービスのバージョン
- IAM インスタンスプロフィール
- ユーザデータ
など、細かな設定もテンプレート化することができます。
では実際に起動テンプレートを作成して、EC2 インスタンスを起動してみましょう!
実践
今回はAWSマネジメントコンソールを使用した場合とAWS CloudFormationを使用した場合の2パターンを実践していきます。
AWS マネジメントコンソールの場合
AWS マネジメントコンソールで起動テンプレートを作成する場合は、EC2 コンソール上のサイドバーにある「インスタンス > 起動テンプレート」をクリック後、オレンジ色のボタン「起動テンプレートを作成」をクリックします。
「起動テンプレートを作成」をクリックすると、EC2 インスタンスを起動するときと同じようにプロパティの設定画面に移ります。
テンプレート名などの必須の項目を入力した後に、テンプレート化したい設定値を指定していきます。
なお、確認するとお気づきの方もいらっしゃると思いますが、多くのプロパティではデフォルトが「起動テンプレートの設定に含めない」となっています。
そのため、特定の設定を個別に指定したい場合は、テンプレートに含めず、起動時に個別に設定することも可能です。
テンプレート化したい設定を指定後、「起動テンプレートを作成」ボタンをクリックします。
再度、起動テンプレートの一覧を確認すると、作成したばかりのテンプレートが表示されます。
テンプレートを利用してEC2 インスタンスを起動するには、使用したいテンプレート横にあるチェックボックスにチェックを入れ、「アクション」ボタンから「テンプレートからインスタンスを起動」を選択します。
あとは必要に応じて、追加の設定を行い「インスタンスを起動」をクリックするだけで起動テンプレートを利用したインスタンスの起動ができます。
AWS CloudFormationの場合
AWS CloudFormationでEC2起動テンプレートを作成する場合はType
がAWS::EC2::LaunchTemplate
となります。
いくつか通常のEC2 インスタンスを起動する際のプロパティ記載方法と異なる点はございますが、基本はLaunchTemplateData
配下にテンプレート化したい設定内容を記載します。
記載方法が異なる点の一部を以下に挙げます。
- IAMインスタンスプロファイルを割り当てる場合、IAMインスタンスプロファイル名ではなく、ARNで指定する
- テンプレートから起動するEC2 インスタンスにタグを付与する場合、
TagSpecification
を利用する DisableApiTermination
、EbsOptimized
、InstanceInitiatedShutdownBehavior
、Monitoring
は起動テンプレートではなく、EC2 インスタンス(AWS::EC2::Instance
)で定義する
なお、AWS マネジメントコンソール上の設定と同様に、記載がないプロパティはテンプレートに含めない、という扱いとなるため部分的にテンプレート化することもできます。
起動テンプレートを作成後、EC2 インスタンスの起動時に起動テンプレートIDと起動テンプレートのバージョン番号を渡すことでテンプレートの内容を利用できます。
LaunchTemplate:
LaunchTemplateId: !Ref EC2LaunchTemplate
Version: !GetAtt EC2LaunchTemplate.LatestVersionNumber
一例ではありますが、起動テンプレートの作成・定義、EC2 インスタンスの起動を合わせると以下のようになります。
AWSTemplateFormatVersion: 2010-09-09
Description: EC2 Launch Template Test
Resources:
# ------------------------------- #
# EC2
# ------------------------------- #
# Launch Template
EC2LaunchTemplate:
Type: AWS::EC2::LaunchTemplate
Properties:
LaunchTemplateName: EC2TestTemplate
LaunchTemplateData:
ImageId: ami-094dc5cf74289dfbc # Amazon Linux 2023
InstanceType: t3.micro
KeyName: TestKey # Key pair name
IamInstanceProfile:
Arn: arn:aws:iam::<AWS Account ID>:instance-profile/<Instance profile name>
BlockDeviceMappings:
- DeviceName: /dev/xvda
Ebs:
DeleteOnTermination: true
Encrypted: true
VolumeSize: 8
VolumeType: gp3
MetadataOptions:
HttpTokens: required
TagSpecifications:
- ResourceType: instance
Tags:
- Key: backupForTest
Value: true
# EC2 Instance
InstanceFromTemplate:
Type: AWS::EC2::Instance
Properties:
LaunchTemplate:
LaunchTemplateId: !Ref EC2LaunchTemplate
Version: !GetAtt EC2LaunchTemplate.LatestVersionNumber
NetworkInterfaces:
- AssociatePublicIpAddress: false
DeleteOnTermination: true
DeviceIndex: 0
GroupSet:
- sg-xxxxxxxxxxxxxxxxx # Security Group ID
SubnetId: subnet-xxxxxxxxxxxxxxxxx # Subnet ID
Tags:
- Key: Name
Value: Test-1
起動テンプレートとして
- AMI
- インスタンスタイプ
- キーペア
- インスタンスプロファイル(IAMロール)
- ストレージの設定
- インスタンスメタデータサービスのバージョン
- 起動したEC2 インスタンスに付与するタグ
を設定してみました。EC2 インスタンス自体はName
タグ、ネットワークの設定を除き、起動テンプレートの設定を利用するようにしています。
起動テンプレートを一度作成しておくと、EC2 インスタンスの定義を簡素化し、効率的に管理することができます。
ネットワーク設定も同じにするのであれば、Name
タグの値を変更して、定義を再利用して同じ構成のEC2 インスタンスを起動することができます。
もちろん、EC2 インスタンスの定義に全てのプロパティを入れて複数回定義する、方法も可能ですが共通で利用するものはテンプレート化することで、CloudFormationのテンプレートをシンプルかつ可読性を向上することが期待できます。
まとめ
今回は起動テンプレートを利用したEC2 インスタンスの起動をやってみました。
何度も利用する構成の場合、パラメータシートなどから起動テンプレートにしておくことで、EC2 インスタンスの起動を迅速化できるのではないでしょうか。
ぜひ、皆様もこの機能を活用して、インフラの構築をより効率的に進めてみてください。